package org.javahispano.javacup.tacticas.tacticas_aceptadas.masia;

import java.util.List;

import org.javahispano.javacup.modelo.comando.Comando;
import org.javahispano.javacup.modelo.comando.ComandoIrA;
import org.javahispano.javacup.modelo.util.Constantes;
import org.javahispano.javacup.modelo.util.Posicion;
import org.javahispano.javacup.modelo.engine.SituacionPartido;

public class Goalkeeper {
	private SituacionPartido sp;
	private List<Comando> comandos;
	private final int index = 0;
	private final Data data;
	
	public Goalkeeper(List<Comando> comandos, Data data) {
		super();		
		this.comandos = comandos;
		this.data = data;
	}
	
	public void execute(SituacionPartido sp){
		this.sp = sp;
		Posicion pos = newPos(); 
		comandos.add(new ComandoIrA(index, pos));		
	}

	
	private Posicion newPos() {
		if(sp.saco() && !inArea(sp.balon()))
			return move(sp.balon(), Integer.MAX_VALUE); 
		int iterBallOpponent = data.getOpponentIterToBall();
		if(iterBallOpponent == -1)
			iterBallOpponent = Integer.MAX_VALUE;
		int i = 0; 
		while(i < iterBallOpponent){
			if(data.getPosBall(i).isDentroCampoJuego(0)){
				boolean inArea = inArea(data.getPosBall(i));
				double dist = sp.misJugadores()[index].distancia(data.getPosBall(i));
				if(dist <= i*Constantes.VELOCIDAD_MAX + Constantes.DISTANCIA_CONTROL_BALON_PORTERO && data.getZBall(i) <= (inArea? Constantes.ALTO_ARCO : Constantes.ALTURA_CONTROL_BALON)){
					return data.getPosBall(i);//.moverAngulo(data.getPosBall(i).angulo(Constantes.centroArcoInf), inArea?Constantes.DISTANCIA_CONTROL_BALON_PORTERO:Constantes.DISTANCIA_CONTROL_BALON, data.getPosBall(i).distancia(Constantes.centroArcoInf));	
				}
			}else
				return move(data.getPosBall(i).setDentroCampoJuego(), Integer.MAX_VALUE); 
			i++;
		}
		return move(data.getPosBall(iterBallOpponent), iterBallOpponent);
	}

	private Posicion move(Posicion posBall, int iter) {
		Posicion pos = Constantes.centroArcoInf.moverAngulo(Constantes.centroArcoInf.angulo(posBall), Constantes.LARGO_ARCO/2, Constantes.centroArcoInf.distancia(posBall));
		int iter1 = (int) Math.ceil((sp.misJugadores()[index].distancia(pos) - Constantes.DISTANCIA_CONTROL_BALON_PORTERO)/Constantes.VELOCIDAD_MAX);
		while(iter<iter1){
			pos = pos.moverAngulo(pos.angulo(Constantes.centroArcoInf), Constantes.REMATE_VELOCIDAD_MAX);
			if(!pos.isDentroCampoJuego(0)){
				pos = pos.moverAngulo(pos.angulo(Constantes.centroArcoInf), Constantes.REMATE_VELOCIDAD_MAX, pos.distancia(Constantes.centroArcoInf));
				break;
			}
			iter1 = (int) Math.ceil((sp.misJugadores()[index].distancia(pos) - Constantes.DISTANCIA_CONTROL_BALON_PORTERO)/Constantes.VELOCIDAD_MAX);
		}
		return pos;
	}

	private boolean inArea(Posicion pos) {
		if(Math.abs(pos.getX()) <= Constantes.LARGO_AREA_GRANDE/2 &&
				pos.getY() <= Constantes.centroArcoInf.getY()+Constantes.ANCHO_AREA_GRANDE)
			return true;
		return false;
	}
}
